import dayjs from 'dayjs'

// 挂载dayjs到uni
export function dayJs(...args) {
  return dayjs(...args)
}

/**
 * @description 格式化时间
 * @param {String} date 需格式化的时间
 * @param {String} format 时间格式
 * @return {String} 格式化后的时间
 * @example formatDate(date,"YYYY-MM-DD") // 时间格式文档 https://dayjs.gitee.io/docs/zh-CN/display/format
 */
export function formatDate(date, format = 'YYYY-MM-DD') {
  return dayjs(date).format(format)
}

/**
 * @description 格式化时间
 * @param {String} time 需格式化的时间
 * @param {String} format 时间格式
 * @return {String} 格式化后的时间
 * @example formatTime(date,"HH:mm:ss") // 时间格式文档 https://dayjs.gitee.io/docs/zh-CN/display/format
 */
export function formatTime(date, format = 'HH:mm:ss') {
  return dayjs(date).format(format)
}

/**
 * @description 查询指定时间的前后指定时间
 * @param {String} date 查询的指定时间
 * @param {Number} day day 前几天或者后几天
 * @param {String} format 时间格式
 * @return {String} 查询到的时间
 * @example aroundDate(date, 5, "YYYY-MM-DD") // 时间格式文档 https://dayjs.gitee.io/docs/zh-CN/display/format
 */
export function aroundDate(date, day = 0, format = 'YYYY-MM-DD') {
  date = new Date(date)
  date.setDate(date.getDate() + day)
  return formatDate(date, format)
}

/**
 * @description 计算给定时间的星期几的日期
 * @param {String} date 查询的指定时间
 * @param {Number} week 周几 1-7
 * @param {String} format 时间格式
 * @return {String} 查询到的时间
 * @example weekDate(date, 5, "YYYY-MM-DD") // 时间格式文档 https://dayjs.gitee.io/docs/zh-CN/display/format
 */
export function weekDate(date, week = 1, format = 'YYYY-MM-DD') {
  date = new Date(date.toString().replace(/-/g, '/'))
  date.setDate(date.getDate() - (date.getDay() == 0 ? 7 : date.getDay()) + week)
  return formatDate(date, format)
}

/**
 * @description 计算时间过去多久了
 * @param {String} date 查询的指定时间
 * @param {String} format 时间格式
 * @return {String} 查询到的时间
 * @example formatPastTime(date,"YYYY-MM-DD") // 时间格式文档 https://dayjs.gitee.io/docs/zh-CN/display/format
 */
export function formatPastTime(date, format = 'YYYY-MM-DD') {
  let timer = new Date().getTime() - new Date(date.replace(/-/g, '/')).getTime()
  timer = parseInt(timer / 1000)
  let tips = ''
  switch (true) {
    case timer < 300:
      tips = '刚刚'
      break
    case timer >= 300 && timer < 3600:
      tips = parseInt(timer / 60) + '分钟前'
      break
    case timer >= 3600 && timer < 86400:
      tips = parseInt(timer / 3600) + '小时前'
      break
    case timer >= 86400 && timer < 2592000:
      tips = parseInt(timer / 86400) + '天前'
      break
    case timer >= 2592000 && timer < 365 * 86400:
      tips = parseInt(timer / (86400 * 30)) + '个月前'
      break
    default:
      tips = formatDate(date.replace(/-/g, '/'), format)
  }
  return tips
}

/**
 * @description 对比时间
 * @param {String|Date} startDate 开始时间
 * @param {String|Date} endDate 结束时间
 * @return {Object} 对比结果
 * @example diffDate(startDate,endDate)
 */
export function diffDate(startDate, endDate) {
  const start = new Date(dayjs(startDate))
  const end = new Date(dayjs(endDate))

  const startYear = start.getFullYear()
  const endYear = end.getFullYear()
  const startMonth = start.getMonth()
  const endMonth = end.getMonth()
  const startDateOfMonth = start.getDate()
  const endDateOfMonth = end.getDate()
  let years = endYear - startYear
  let months = endMonth - startMonth
  let days = endDateOfMonth - startDateOfMonth

  if (months < 0) {
    years--
    months += 12
  }

  if (days < 0) {
    const prevMonthEndDate = new Date(endYear, endMonth, 0).getDate()
    days = prevMonthEndDate - startDateOfMonth + endDateOfMonth
    months--
    if (months < 0) {
      years--
      months += 12
    }
  }

  const hours = end.getHours() - start.getHours()
  const minutes = end.getMinutes() - start.getMinutes()
  const seconds = end.getSeconds() - start.getSeconds()
  const milliseconds = end.getMilliseconds() - start.getMilliseconds()
  return { years, months, days, hours, minutes, seconds, milliseconds }
}

/**
 * 根据日期字符串判断日期在本周内还是下周，以及是本周的哪一天或是具体日期
 * @param {string} date - 表示日期的字符串，格式为 "YYYY-MM-DD" 或其他合法日期格式
 * @returns {string} - 返回描述日期的文字，例如 "本周一"，"下周二" 或具体日期字符串
 */
export function formatWeekDesc(date) {
  const monday = dayjs().day(1)
  const { days } = diffDate(monday, dayjs(date))
  const weekDays = [
    '本周一',
    '本周二',
    '本周三',
    '本周四',
    '本周五',
    '本周六',
    '本周日',
    '下周一',
    '下周二',
    '下周三',
    '下周四',
    '下周五',
    '下周六',
    '下周日'
  ]
  return weekDays[days] || dayjs(date).format('YYYY-MM-DD')
}

/**
 * 根据日期字符串判断日期在本周内还是下周，以及是本周的哪一天或是具体日期
 * @param {string} date - 表示日期的字符串，格式为 "YYYY-MM-DD" 或其他合法日期格式
 * @returns {string} - 返回描述日期的文字，例如 "本周一"，"下周二" 或具体日期字符串
 */
export function formatDayWeekDesc(date) {
  const today = dayjs()
  const week = dayjs(date).day()
  const { days: day } = diffDate(today, dayjs(date))
  const days = ['今天', '明天', '后天']
  const weekDays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']
  if (day >= 0 && day < 3) return days[day]
  return weekDays[week] || dayjs(date).format('YYYY-MM-DD')
}
